package com.qf.test;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

/**
 * 测试shiro权限框架基本使用
 * @author fy
 * @version V1.0
 * @Project workspace
 * @Package com.qf.test
 * @Description:
 * @Date 2022/6/13 9:54
 */
public class ShiroDemo {

    public static void main(String[] args) {
        //1.获取SecurityManager核心对象
        DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
        //2.获取配置文件中的权限数据，用户数据，角色数据
        IniRealm iniRealm = new IniRealm("classpath:shiro.ini");
        //3.将用户，角色，权限数据放入SecurityManager核心对象中
        defaultSecurityManager.setRealm(iniRealm);
        //4.设置SecurityManager核心对象工具类
        SecurityUtils.setSecurityManager(defaultSecurityManager);
        //5.得到Subject当前登录用户对象
        Subject subject = SecurityUtils.getSubject();
        //6.登录，封装AuthenticationToken对象，模拟用户在页面输入的用户名密码
        AuthenticationToken token = new UsernamePasswordToken("zhangsan", "123456");
        //7.调用login登陆方法，让shiro框架核心SecurityManager对象去验证用户输入的用户名密码和
        //配置问价或者数据库中记录的用户名和密码是否一致，进行权限校验
        try {
            //用户输入的用户名密码和shiro.ini进行对比
            subject.login(token);
            System.out.println("登录成功");
        }catch (UnknownAccountException e){
            System.out.println("账号不存在");
        }catch(IncorrectCredentialsException e){
            //8.如果用户名，密码不对，抛出对应异常
            System.out.println("密码错误");
        }catch (AuthenticationException e)
        {
            System.out.println("其他异常");
        }

        //9.如果用户名密码正确，获取角色, 权限等框架中能够获取到的用户信息打印, 登录成功、
        System.out.println("===========登录后判断角色=============");
        System.out.println("--------判断角色是否为管理员角色---------"+subject.hasRole("admin"));
        System.out.println("--------判断角色是否为开发者角色---------"+subject.hasRole("developer"));
        System.out.println("--------判断角色是否为xxx角色---------"+subject.hasRole("xxx"));

        System.out.println("==========登录后判断用户权限=====父模块:子模块:操作=========");
        System.out.println("---------判断当前用户是否有用户添加权限----------"+subject.isPermitted("sys:user:add"));
        System.out.println("---------判断当前用户是否有用户删除权限----------"+subject.isPermitted("sys:user:del"));
        System.out.println("---------判断当前用户是否有菜单添加权限----------"+subject.isPermitted("sys:menu:add"));
        System.out.println("---------判断当前用户是否有菜单删除权限----------"+subject.isPermitted("sys:menu:del"));

    }
}
